为什么SAM可以实现更好的泛化?如何在Pytorch中实现SAM?

您所在的位置:网站首页 torch optimizer 为什么SAM可以实现更好的泛化?如何在Pytorch中实现SAM?

为什么SAM可以实现更好的泛化?如何在Pytorch中实现SAM?

#为什么SAM可以实现更好的泛化?如何在Pytorch中实现SAM?| 来源: 网络整理| 查看: 265

导读 使用SAM(锐度感知最小化),优化到损失的最平坦的最小值的地方,增强泛化能力。

动机来自先前的工作,在此基础上,我们提出了一种新的、有效的方法来同时减小损失值和损失的锐度。具体来说,在我们的处理过程中,进行锐度感知最小化(SAM),在领域内寻找具有均匀的低损失值的参数。这个公式产生了一个最小-最大优化问题,在这个问题上梯度下降可以有效地执行。我们提出的实证结果表明,SAM在各种基准数据集上都改善了的模型泛化。

在深度学习中,我们使用SGD/Adam等优化算法在我们的模型中实现收敛,从而找到全局最小值,即训练数据集中损失较低的点。但等几种研究表明,许多网络可以很容易地记住训练数据并有能力随时overfit,为了防止这个问题,增强泛化能力,谷歌研究人员发表了一篇新论文叫做Sharpness Awareness Minimization,在CIFAR10上以及其他的数据集上达到了最先进的结果。

在本文中,我们将看看为什么SAM可以实现更好的泛化,以及我们如何在Pytorch中实现SAM。

SAM的原理是什么?

在梯度下降或任何其他优化算法中,我们的目标是找到一个具有低损失值的参数。但是,与其他常规的优化方法相比,SAM实现了更好的泛化,它将重点放在领域内寻找具有均匀的低损失值的参数(而不是只有参数本身具有低损失值)上。

由于计算邻域参数而不是计算单个参数,损失超平面比其他优化方法更平坦,这反过来增强了模型的泛化。

(左))用SGD训练的ResNet收敛到的一个尖锐的最小值。(右)用SAM训练的相同的ResNet收敛到的一个平坦的最小值。

注意:SAM不是一个新的优化器,它与其他常见的优化器一起使用,比如SGD/Adam。

在Pytorch中实现SAM

在Pytorch中实现SAM非常简单和直接

import torch

class SAM(torch.optim.Optimizer):

def __init__(self, params, base_optimizer, rho=0.05, **kwargs):

assert rho 》= 0.0, f“Invalid rho, should be non-negative: {rho}”

defaults = dict(rho=rho, **kwargs)

super(SAM, self).__init__(params, defaults)

self.base_optimizer = base_optimizer(self.param_groups, **kwargs)

self.param_groups = self.base_optimizer.param_groups

@torch.no_grad()

def first_step(self, zero_grad=False):

grad_norm = self._grad_norm()

for group in self.param_groups:

scale = group[“rho”] / (grad_norm + 1e-12)

for p in group[“params”]:

if p.grad is None: continue

e_w = p.grad * scale.to(p)

p.add_(e_w) # climb to the local maximum “w + e(w)”

self.state[p][“e_w”] = e_w

if zero_grad: self.zero_grad()

@torch.no_grad()

def second_step(self, zero_grad=False):

for group in self.param_groups:

for p in group[“params”]:

if p.grad is None: continue

p.sub_(self.state[p][“e_w”]) # get back to “w” from “w + e(w)”

self.base_optimizer.step() # do the actual “sharpness-aware” update

if zero_grad: self.zero_grad()

def _grad_norm(self):

shared_device = self.param_groups[0][“params”][0].device # put everything on the same device, in case of model parallelism

norm = torch.norm(

torch.stack([

p.grad.norm(p=2).to(shared_device)

for group in self.param_groups for p in group[“params”]

if p.grad is not None

]),

p=2

return norm

代码取自非官方的Pytorch实现。

代码解释:

首先,我们从Pytorch继承优化器类来创建一个优化器,尽管SAM不是一个新的优化器,而是在需要继承该类的每一步更新梯度(在基础优化器的帮助下)。

该类接受模型参数、基本优化器和rho, rho是计算最大损失的邻域大小。

在进行下一步之前,让我们先看看文中提到的伪代码,它将帮助我们在没有数学的情况下理解上述代码。

bf4472f8-92a2-11eb-8b86-12bb97331649.jpg

正如我们在计算第一次反向传递后的伪代码中看到的,我们计算epsilon并将其添加到参数中,这些步骤是在上述python代码的方法first_step中实现的。

现在在计算了第一步之后,我们必须回到之前的权重来计算基础优化器的实际步骤,这些步骤在函数second_step中实现。

函数_grad_norm用于返回矩阵向量的norm,即伪代码的第10行

在构建这个类后,你可以简单地使用它为你的深度学习项目通过以下的训练函数片段。

from sam import SAM

。。.

model = YourModel()

base_optimizer = torch.optim.SGD # define an optimizer for the “sharpness-aware” update

optimizer = SAM(model.parameters(), base_optimizer, lr=0.1, momentum=0.9)

。。.

for input, output in data:

# first forward-backward pass

loss = loss_function(output, model(input)) # use this loss for any training statistics

loss.backward()

optimizer.first_step(zero_grad=True)

# second forward-backward pass

loss_function(output, model(input)).backward() # make sure to do a full forward pass

optimizer.second_step(zero_grad=True)

。。.

总结

虽然SAM的泛化效果较好,但是这种方法的主要缺点是,由于前后两次计算锐度感知梯度,需要花费两倍的训练时间。除此之外,SAM还在最近发布的NFNETS上证明了它的效果,这是ImageNet目前的最高水平,在未来,我们可以期待越来越多的论文利用这一技术来实现更好的泛化。

英文原文:https://pub.towardsai.net/we-dont-need-to-worry-about-overfitting-anymore-9fb31a154c81 编辑:lyn

SAM SAM +关注

关注

0

文章

42

浏览量

31716 深度学习 深度学习 +关注

关注

70

文章

3995

浏览量

112060 pytorch pytorch +关注

关注

1

文章

121

浏览量

10602

原文标题:【过拟合】再也不用担心过拟合的问题了

文章出处:【微信号:zenRRan,微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

扫一扫,分享给好友

复制链接分享 评论

发布评论请先 登录

相关推荐

让AI应用程序为本机云做好准备   Fleet Command 将应用程序部署为容器。通过使用容器,您可以在同一系统上部署多个应用程.... 的头像 星星科技指导员 发表于 06-21 16:07 • 139次 阅读 使用TREX探索NVIDIA TensorRT引擎   元数据 JSON 文件描述了引擎的生成器配置以及用于构建引擎的 GPU 的相关信息。此信息为引擎.... 的头像 星星科技指导员 发表于 06-21 15:52 • 151次 阅读 使用TREX探索NVIDIA TensorRT引擎 5种前沿的点云分割网络 整体的PointNet网络中,除了点云的感知以外,还有T-Net,即3D空间变换矩阵预测网络,这主要.... 的头像 新机器视觉 发表于 06-21 11:08 • 126次 阅读 TurboTransformers Transformer加速工具 ./oschina_soft/TurboTransformers.zip 发表于 06-21 10:59 • 3次 阅读 TurboTransformers Transformer加速工具 Jittor(计图)即时编译深度学习框架 ./oschina_soft/gitee-jittor.zip 发表于 06-21 10:33 • 5次 阅读 Jittor(计图)即时编译深度学习框架 MegEngine(天元)深度学习框架 ./oschina_soft/MegEngine.zip 发表于 06-21 10:32 • 3次 阅读 MegEngine(天元)深度学习框架 一种新方法GSConv来减轻模型的复杂度并保持准确性 类脑研究的直观理解是,神经元越多的模型获得的非线性表达能力越强。但不可忽视的是,生物大脑处理信息的强.... 的头像 OpenCV学堂 发表于 06-21 10:29 • 98次 阅读 PyTorch3D 3D深度学习函数库 ./oschina_soft/pytorch3d.zip 发表于 06-21 10:11 • 3次 阅读 PyTorch3D 3D深度学习函数库 Clause语义理解系统 ./oschina_soft/clause.zip 发表于 06-21 09:55 • 1次 阅读 Clause语义理解系统 Paddle Lite飞桨多平台高性能深度学习预测引擎 ./oschina_soft/gitee-paddle-lite.zip 发表于 06-21 09:43 • 3次 阅读 Paddle Lite飞桨多平台高性能深度学习预测引擎 开源软件-DLPack开放的内存张量结构 ./oschina_soft/dlpack.zip 发表于 06-21 09:26 • 7次 阅读 开源软件-DLPack开放的内存张量结构 Transformer模型结构,训练过程 所以我们为此文章写了篇注解文档,并给出了一行行实现的Transformer的代码。本文档删除了原文的.... 的头像 新机器视觉 发表于 06-20 14:26 • 89次 阅读 开源软件-Msnhnet小型PyTorch推理框架 ./oschina_soft/Msnhnet.zip 发表于 06-20 09:28 • 6次 阅读 开源软件-Msnhnet小型PyTorch推理框架 开源软件-OneFlow通用深度学习框架 ./oschina_soft/oneflow.zip 发表于 06-20 09:26 • 10次 阅读 开源软件-OneFlow通用深度学习框架 基于深度学习的边缘计算服务器助力AI人工智能 随着深度学习、医药研发、生命科学、遥感测绘、高性能计算、数据研发、数据挖掘的快速发展,基于人工智能的.... 的头像 科技观点 发表于 06-20 09:04 • 179次 阅读 基于深度学习的边缘计算服务器助力AI人工智能 基于深度学习的水冷工作站加速遥感测绘应用研发 在深度学习、高性能计算、大数据、计算机电子技术、图像渲染、视觉计算快速发展的大背景下,地质遥感技术脱.... 的头像 GPU视觉识别 发表于 06-17 15:38 • 88次 阅读 基于深度学习的水冷工作站加速遥感测绘应用研发 AKG深度学习网络优化程序 ./oschina_soft/gitee-akg.zip 发表于 06-17 14:50 • 3次 阅读 AKG深度学习网络优化程序 Kaolin加速3D深度学习研究 ./oschina_soft/kaolin.zip 发表于 06-17 11:18 • 9次 阅读 Kaolin加速3D深度学习研究 OpenPPL高性能深度学习推理平台 ./oschina_soft/ppl.nn.zip 发表于 06-17 11:16 • 13次 阅读 OpenPPL高性能深度学习推理平台 WeChat TFCC微信云端深度学习推理框架 ./oschina_soft/WeChat-TFCC.zip 发表于 06-17 10:31 • 5次 阅读 WeChat TFCC微信云端深度学习推理框架 APACHE MXNET深度学习框架的概念、工作原理及用例 Apache MXNet 是一个灵活且可扩展的深度学习框架,支持多种深度学习模型、编程语言,并且有一.... 的头像 NVIDIA英伟达 发表于 06-17 09:23 • 138次 阅读 Pytorch实现MNIST手写数字识别 Pytorch 实现MNIST手写数字识别 发表于 06-16 14:47 • 3次 阅读 Forward DL深度学习推理加速框架 ./oschina_soft/Forward.zip 发表于 06-16 14:33 • 19次 阅读 Forward DL深度学习推理加速框架 PatrickStar分布式深度学习训练工具 ./oschina_soft/PatrickStar.zip 发表于 06-16 11:06 • 7次 阅读 PatrickStar分布式深度学习训练工具 Adlik加速深度学习推理的工具包 ./oschina_soft/Adlik.zip 发表于 06-16 10:19 • 6次 阅读 Adlik加速深度学习推理的工具包 DLVC基于深度学习的视频编码 ./oschina_soft/DLVC.zip 发表于 06-16 09:26 • 3次 阅读 DLVC基于深度学习的视频编码 三步骤快速实现PaddleOCR实时推理 前言:该技术能让PaddleOCR的开发者在笔记本电脑上即可获得超越40FPS的速度,极大降低了Pa.... 的头像 英特尔物联网 发表于 06-09 17:18 • 307次 阅读 几种基于深度学习的中文纠错模型 Confusionset-guided Pointer Network看起来跟之前提及的CopyNe.... 的头像 深度学习自然语言处理 发表于 06-09 11:19 • 1163次 阅读 多个能将深度学习训练过程进行可视化的工具 Visual DL是百度开发的,基于echar和PaddlePaddle,支持PaddlePaddl.... 的头像 新机器视觉 发表于 06-09 11:17 • 262次 阅读 NVIDIA零信任平台的作用是什么 随着远程混合办公、自带设备(BYOD)和基于云计算的基础设施等数字企业趋势带动了设备和用户与企业网络.... 的头像 NVIDIA英伟达 发表于 06-09 09:47 • 176次 阅读 揭开人工智能和机器学习的神秘面纱   从日常使用的可穿戴设备收集的人体生理信号成为新的数字生物标志物,可以提供我们健康的全面图片,这一.... 的头像 星星科技指导员 发表于 06-08 10:28 • 269次 阅读 揭开人工智能和机器学习的神秘面纱 Animegan2-pytorch图片/视频转动漫风格 ./oschina_soft/animegan2-pytorch.zip 发表于 06-07 14:35 • 17次 阅读 Animegan2-pytorch图片/视频转动漫风格 共聚、共研、共创,飞桨联合国内外硬件伙伴构建软硬一体智能化全新生态 百度AI技术生态总经理马艳军表示,飞桨将联合硬件生态伙伴,通过技术的联合研发和生态共建,一起开拓出更.... 的头像 Duke 发表于 06-07 09:34 • 889次 阅读 共聚、共研、共创,飞桨联合国内外硬件伙伴构建软硬一体智能化全新生态 很好的一本书,适合初学者 发表于 06-05 18:49 • 3702次 阅读 什么是知识图谱?人工智能世界知识图谱的发展 1.1 什么是知识图谱   知识图谱是一种用图模型来描述知识和建模世界万物之间的关联关系的技术方法[.... 的头像 恬静简朴1 发表于 06-01 19:54 • 885次 阅读 什么是知识图谱?人工智能世界知识图谱的发展 PolyFun生成Low Poly风格图片 ./oschina_soft/PloyFun.zip 发表于 05-31 14:28 • 8次 阅读 PolyFun生成Low Poly风格图片 KITTI 3D检测数据集 因为gt label中提供的bbox信息是Camera坐标系的,因此在训练时需要使用外参等将其转换到.... 的头像 新机器视觉 发表于 05-31 10:49 • 253次 阅读 docTR OCR文档文本识别 ./oschina_soft/doctr.zip 发表于 05-30 10:45 • 19次 阅读 docTR OCR文档文本识别 SwinIR图片修复工具 ./oschina_soft/SwinIR.zip 发表于 05-30 10:34 • 31次 阅读 SwinIR图片修复工具 基于AI的实时感知提升自动代客泊车功能   PSA 系统在 NVIDIA DRIVE AGX 上运行仅几毫秒,就可以以惊人的准确性实现复杂的.... 的头像 星星科技指导员 发表于 05-30 10:11 • 343次 阅读 基于AI的实时感知提升自动代客泊车功能 MMOCR基于PyTorch的文本检测工具 ./oschina_soft/mmocr.zip 发表于 05-30 09:43 • 27次 阅读 MMOCR基于PyTorch的文本检测工具 深度学习模型转成TensorRT引擎的流程 前面我们花了很多力气在 TAO 上面训练模型,其最终目的就是要部署到推理设备上发挥功能。除了将模型训.... 的头像 NVIDIA英伟达企业解决方案 发表于 05-25 11:24 • 371次 阅读 vim-vala vim的vala扩展 ./oschina_soft/vim-vala.zip 发表于 05-24 16:57 • 90次 阅读 vim-vala vim的vala扩展 deoplete.nvim Neovim​异步完成框架 ./oschina_soft/deoplete.nvim.zip 发表于 05-24 09:52 • 19次 阅读 deoplete.nvim Neovim​异步完成框架 C#平台调用OpenVINO的可行性 OpenVINO 工具套件是英特尔基于自身现有的硬件平台开发的一种可以加快高性能计算机视觉和深度学习.... 的头像 OpenCV学堂 发表于 05-24 09:37 • 401次 阅读 NVIDIA DGX A100助力百图生科构建生物计算引擎   基于以上挑战,百图生科采用了 NVIDIA DGX A100 80GB,将深度学习训练、推理和分.... 的头像 星星科技指导员 发表于 05-20 15:07 • 313次 阅读 NVIDIA TensorRT和DLA分析   位于 GitHub 存储库中的sampleMNIST演示了如何导入经过训练的模型、构建 Tens.... 的头像 星星科技指导员 发表于 05-18 10:06 • 369次 阅读 Torch-TensorRT软件更新 HF BERT性能提升40% 我们十分高兴地宣布,Torch-TensorRT 1.1.0 版本正式发布! 的头像 NVIDIA英伟达企业解决方案 发表于 05-16 15:56 • 487次 阅读 迁移学习 上课时间安排 2022年05月27日 — 2022年05月30日    No.1 第一天   一、机器学习简介与经典机器学习算法... 发表于 04-21 15:15 • 8813次 阅读 深度学习技术的开发与应用 [table] [tr][td=103]时间安排[/td][td=92]大  纲[/td][td=2,1,240]具体内容[/td][td=237]实操案例[/td][/tr] [tr][... 发表于 04-21 14:57 • 13437次 阅读 pytorch模型Syntax error in input!是什么原因导致的 发表于 04-02 14:23 • 2399次 阅读 求大佬分享RK3399运行瑞芯微官方yolov5 C++代码 求大佬分享RK3399运行瑞芯微官方yolov5 C++代码 发表于 03-07 06:33 • 660次 阅读 怎样配置rk3568 RKNN呢 怎样配置rk3568 RKNN呢?有哪些配置步骤? 发表于 03-02 10:18 • 1509次 阅读 简单整理下几款合适的嵌入式硬件平台 本来想温习下数电,模电,单片机,电路设计,外围配套端口和设备方面的知识,往底层硬件方面去,鉴于精力有限,初衷点是想把算法... 发表于 02-17 08:02 • 854次 阅读 如何去实现基于K210的MNIST手写数字识别 基于K210的MNIST手写数字识别硬件平台        采用Maixduino开发板     &... 发表于 02-17 07:35 • 840次 阅读 一台四驱麦克纳姆轮小车的设计资料分享 一台四驱麦克纳姆轮小车(淘宝购买麦克纳姆轮小车(店铺:墨比斯科技))树莓派3b+激光雷达arduino mega2560单片机控制器加电机驱... 发表于 02-15 07:28 • 425次 阅读 如何实现简易洗衣机系统Multisim仿真设计? 如何实现简易洗衣机系统Multisim仿真设计? 发表于 02-15 06:16 • 531次 阅读


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3